﻿using System.Collections.Generic;
using System.Linq;
using Neptuno.Model;
using System;

namespace Neptuno.Component
{
    public class ViajesComponent : BaseComponent
    {
        public ViajesComponent()
            : base()
        {
            Context.ContextOptions.LazyLoadingEnabled = false;
        }

        public Recaladas AgregarRecalada(Recaladas Recalada)
        {
            Context.Recaladas.AddObject(Recalada);
            Context.TryToSave();
            return Recalada;
        }

        public bool AgregarRecaladaPuerto(RecaladasPuertos RecaladaPuerto)
        {
            Recaladas Recalada = this.Context.Recaladas.SingleOrDefault(t => t.idRecalada == RecaladaPuerto.idRecalada);

            Context.RecaladasPuertos.AddObject(RecaladaPuerto);
            return Context.TryToSave();
        }

        public bool AgregarRegistroRecalada(RegistrosRecaladas RegistroRecalada)
        {
            Recaladas Recalada = this.Context.Recaladas.SingleOrDefault(t => t.idRecalada == RegistroRecalada.idRecalada);

            Context.RegistrosRecaladas.AddObject(RegistroRecalada);
            return Context.TryToSave();
        }

        public bool AgregarArchivo(Archivos Archivo)
        {
            Recaladas Recalada = this.Context.Recaladas.SingleOrDefault(t => t.idRecalada == Archivo.idRecalada);

            Context.Archivos.AddObject(Archivo);
            return Context.TryToSave();
        }

        public Viajes AgregarViaje(Viajes viaje)
        {
            Context.Viajes.AddObject(viaje);
            Context.TryToSave();
            return viaje;
        }

        public bool ActualizarViaje(Viajes viaje)
        {
            Viajes myViaje = Context.Viajes.SingleOrDefault(v => v.idViaje == viaje.idViaje);

            myViaje.idTerminal = viaje.idTerminal;
            myViaje.codigoViaje = viaje.codigoViaje;
            myViaje.Sentido = viaje.Sentido;

            return Context.TryToSave();
        }

        public List<Recaladas> ListarByEstado(int Estado, int? idAgencia = null, int? skip = null, int? range = null)
        {
            List<Recaladas> Lista = Context.Recaladas
                .IncludeAll()
                .Include(r => r.Buques.Lineas)
                .Include(r => r.Buques.Paises)
                .Where(t => t.estado == Estado)
                .ToList();

            if (idAgencia.HasValue)
                Lista = Lista.Where(t => t.idAgencia == idAgencia.Value).ToList();

            if (skip.HasValue && range.HasValue)
                Lista = Lista.Skip(skip.Value).Take(range.Value).ToList();

            Lista.ForEach(delegate(Recaladas t)
            {
                if (t.RecaladasPuertos != null)
                    t.RecaladasPuertos.Recaladas = null;
            });

            return Lista;
        }

        public List<Recaladas> ListarByEta(DateTime RangoInicial, DateTime RangoFinal, int idAgencia)
        {
            List<Recaladas> Lista = Context.Recaladas
                .IncludeAll()
                .Include(r => r.Buques.Lineas)
                .Include(r => r.Buques.Paises)
                .Where(t => t.eta >= RangoInicial && t.eta <= RangoFinal && t.idAgencia == idAgencia)
                .ToList();

            Lista.ForEach(delegate(Recaladas t)
            {
                if (t.RecaladasPuertos != null)
                    t.RecaladasPuertos.Recaladas = null;
            });

            return Lista;
        }

        public List<Recaladas> Listar(int? idAgencia = null, int? skip = null, int? range = null)
        {
            List<Recaladas> Lista = Context.Recaladas
                .IncludeAll()
                .Include(r => r.Buques.Lineas)
                .Include(r => r.Buques.Paises)
                .ToList();

            if (idAgencia.HasValue)
                Lista = Lista.Where(t => t.idAgencia == idAgencia.Value).ToList();

            if (skip.HasValue && range.HasValue)
                Lista = Lista.Skip(skip.Value).Take(range.Value).ToList();

            Lista.ForEach(delegate(Recaladas t)
            {
                if (t.RecaladasPuertos != null)
                    t.RecaladasPuertos.Recaladas = null;
            });

            return Lista;
        }

        public RecaladasPuertos GetRecaladaPuerto(int idRecalada)
        {
            RecaladasPuertos RecaladaPuerto = Context.RecaladasPuertos
                .Include(r => r.Puertos.Paises)
                .Include(r => r.Puertos1.Paises)
                .Include(r => r.Puertos2.Paises)
                .SingleOrDefault(t => t.idRecalada == idRecalada);
            return RecaladaPuerto;
        }

        public Viajes GetViaje(int id)
        {
            return Context.Viajes.Include(v => v.Terminales).SingleOrDefault(v => v.idViaje == id);
        }

        public List<Archivos> GetArchivos(int idRecalada)
        {
            return Context.Archivos.Where(t => t.idRecalada == idRecalada).ToList();
        }

        public List<RegistrosRecaladas> GetRegistrosRecaladas(int idRecalada)
        {
            return Context.RegistrosRecaladas.Where(t => t.idRecalada == idRecalada).ToList();
        }

        public Recaladas GetById(int idRecalada)
        {
            Recaladas Recalada = Context.Recaladas
                .IncludeAll()
                .Include(r => r.Buques.Paises)
                .Include(r => r.Buques.Lineas)
                .Include(r => r.Viajes.Terminales.Puertos)
                .Include(r => r.Viajes1.Terminales.Puertos)
                .SingleOrDefault(t => t.idRecalada == idRecalada);


            if (Recalada.RecaladasPuertos != null)
                Recalada.RecaladasPuertos.Recaladas = null;

            return Recalada;
        }

        public bool Actualizar(Recaladas Recalada)
        {
            Recaladas myRecalada = Context.Recaladas.SingleOrDefault(t => t.idRecalada == Recalada.idRecalada);

            myRecalada.idBuque = Recalada.idBuque;
            myRecalada.cutoffDocumental = Recalada.cutoffDocumental;
            myRecalada.cutoffFisico = Recalada.cutoffFisico;
            myRecalada.estado = Recalada.estado;
            myRecalada.eta = Recalada.eta;
            myRecalada.etd = Recalada.etd;
            myRecalada.tipoRecalada = Recalada.tipoRecalada;
            myRecalada.idViajeCargue = Recalada.idViajeCargue;
            myRecalada.idViajeDescargue = Recalada.idViajeDescargue;
            myRecalada.niv = Recalada.niv;
            myRecalada.observaciones = Recalada.observaciones;
            myRecalada.uvi = Recalada.uvi;

            return Context.TryToSave();
        }

        public bool ActualizarRegistroRecalada(RegistrosRecaladas Recalada)
        {
            RegistrosRecaladas myRecalada = Context.RegistrosRecaladas.SingleOrDefault(t => t.idRecalada == Recalada.idRecalada);

            myRecalada.idTipoRegistro = Recalada.idTipoRegistro;
            myRecalada.value = Recalada.value;

            return Context.TryToSave();
        }

        public bool ActualizarRecaladaPuerto(RecaladasPuertos Recalada)
        {
            RecaladasPuertos myRecalada = Context.RecaladasPuertos.SingleOrDefault(t => t.idRecalada == Recalada.idRecalada);

            myRecalada.idPuertoArribo = Recalada.idPuertoArribo;
            myRecalada.idPuertoDestino = Recalada.idPuertoDestino;
            myRecalada.idPuertoOrigen = Recalada.idPuertoOrigen;

            return Context.TryToSave();
        }

        public bool EliminarRegistroRecalada(int id)
        {
            RegistrosRecaladas RegistroRecalada = this.Context.RegistrosRecaladas.Single(t => t.idRecalada == id);
            this.Context.RegistrosRecaladas.DeleteObject(RegistroRecalada);
            return this.Context.TryToSave();
        }

        public bool EliminarArchivo(int id)
        {
            Archivos Archivo = this.Context.Archivos.Single(t => t.idRecalada == id);
            this.Context.Archivos.DeleteObject(Archivo);
            return this.Context.TryToSave();
        }
    }
}
